/*
 * listaInvertida.cpp
 *
 *  Created on: 05/11/2013
 *      Author: Miguel
 */

#include "ListaInvertida.h"

ListaInvertida::ListaInvertida(const String& nombre, int block_size):
	OT(nombre, block_size), FT(nombre, block_size), file_listas(block_size)
{
	path_listas = "Archivos de la lista/listas/LISTAS" + nombre;
	this->nombre = nombre;
}

ListaInvertida::~ListaInvertida() {}

void ListaInvertida::preparar() {
	if( !file_listas.open(path_listas)){
		file_listas.create(path_listas);
	}
}

void ListaInvertida::cerrar() {
	file_listas.close();
}

void ListaInvertida::salvarNuevaLista(const Lista lista) {
	file_listas.add(lista);
}

String ListaInvertida::crearFrecuenciasFile(std::vector<int> listaDeIds) {
	String string_termino;
	HandlerDeTexto handler;
	BigInt idTerm;
	int i=0;
	OT.abrir();
	std::ifstream documento( (DIRECCION+nombre+Utils::toString(listaDeIds[i])+TXT).c_str());
	while( documento.good() ) {
		while( handler.leerPalabra(string_termino, documento) ) {
			if( !vocabulario.terminoIrrelevante(string_termino)){
				idTerm = vocabulario.agregarYDevolverID(string_termino);
				OT.agregarIDAlDoc(idTerm, listaDeIds[i]);
			}
		}
		documento.close();
		documento.clear();
		i++;
		documento.open( (DIRECCION+nombre+Utils::toString(listaDeIds[i])+TXT).c_str());
	}
	documento.close();
	OT.cerrar();

	path_ordenado = OT.ordenar();

	//OT.listarOrdenado();

	return FT.crearArchivoConFrecuencias(path_ordenado);
}

String ListaInvertida::crearListasFile(SecuentialFile<IDs>& frecuencias) {
	preparar();

	IDs idActual, idSiguiente;
	Lista lista;
	frecuencias.next(idActual);
	lista.crearConDoc(idActual);
	while( frecuencias.next(idSiguiente) ) {
		if ( idActual.getIdTermino() == idSiguiente.getIdTermino() )
			lista.agregarDoc(idSiguiente);
		else {
			salvarNuevaLista(lista);
			idActual = idSiguiente;
			lista.crearConDoc(idActual);
		}
	}
	salvarNuevaLista(lista);
	cerrar();
	frecuencias.close();

	//imprimirListas();
	eliminarTemporales();

	return path_listas;
}

bool ListaInvertida::recuperarLista(BigInt idTerm, Lista& listaVacia) {
	file_listas.open(path_listas);
	file_listas.rewind();

	while( file_listas.next(listaVacia) ) {
		if (listaVacia.getIdTerm() == idTerm) {
			file_listas.close();
			return true;
		}
		listaVacia.limpiar();
	}
	file_listas.close();
	return false;
}

void ListaInvertida::imprimirListas(){
	file_listas.open(path_listas);
	file_listas.rewind();

	lista.limpiar();
	while( file_listas.next(lista)){
		lista.imprimir();
		lista.limpiar();
	}
	file_listas.close();
}

void ListaInvertida::eliminarTemporales() {
	OT.eliminar();
	FT.eliminar();
}
